﻿using System;   
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Entity;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ThaiHoa.Win.QLSX.Entity;
using ThaiHoa.Win.QLSX.DAL;
using ThaiHoa.Win.QLSX.SanXuat.UTI;

namespace ThaiHoa.Win.QLSX.SanXuat.UI
{
    public partial class frmCongDoanSanXuatDetail : Form
    {
        #region Fields
        private KhoDBContext db;
        private CongDoan congDoan;
        private List<ThanhPham> listThanhPham;
        public Guid Id;
        Access acs;
        public event EventHandler DBChanged;
        #endregion
        #region Constructor
        public frmCongDoanSanXuatDetail()
        {
            InitializeComponent();
        }
        #endregion
        #region Functions
        private void KhoiTao()
        {
            acs = new Access();
            db = new KhoDBContext();
            congDoan = new CongDoan();            
            //tạo nguồn cho combo
            listThanhPham = db.ThanhPham.Include("DonViTinh").Where(t => t.TrangThai).ToList();
            //chỉ hiên thành phẩm nào chưa được tạo công đoạn
            List<ThanhPham> listThanhPhamDaDuocTao = db.CongDoan.Include(c => c.ThanhPham).Where(c => c.TrangThai).Select(c=>c.ThanhPham).ToList();
            listThanhPham.RemoveAll(l => listThanhPhamDaDuocTao.Contains(l));
            
            //Xử lý 2 trường hợp cụ thế :
            //Thêm mới và xem chi tiết
            if (Id != Guid.Empty)// Truong hop xem chi tiet
            {
                //Tìm vị trí của object có Id tương ứng
                int pos = -1;
                //pos = CongDoanSanXuatBS.Find("MaMatHang","dfi");
                CongDoan item = db.CongDoan.Include(c=>c.ThanhPham).Include(c=>c.ChiTiet).FirstOrDefault(m => m.Id.Equals(Id));
                if (item == null)
                    return;
                //Thay lại máy
                for (int i = 0; i < item.ChiTiet.Count; i++)
                {
                    Guid Id1 = item.ChiTiet[i].Id;
                    CongDoanChiTiet ct = db.CongDoanChiTiet.Include(c => c.May).FirstOrDefault(c => c.Id.Equals(Id1));
                    item.ChiTiet[i] = ct;

                }
                congDoan = item;
                //Hiển thị thành phẩm
                listThanhPham.Add(congDoan.ThanhPham);
                cbThanhPham.DataSource = listThanhPham;
                cbThanhPham.SelectedItem = congDoan.ThanhPham;
                cbThanhPham.Enabled = false;
                //Hiển thị caption
                this.Text = string.Format("Công đoạn cho: {0}",congDoan.ThanhPham.MaMatHang);
            }
            else // Truong hop them moi
            {
                cbThanhPham.DataSource = listThanhPham;
                this.Text = "New Item";

            }
            //Binding cho gridview
            dgvCongDoanChiTiet.DataSource = congDoan.ChiTiet.OrderBy(c=>c.ThuTu).Where(c=>c.TrangThai).ToList();
            DataGridViewImageColumn xoaColumn = new DataGridViewImageColumn();
            xoaColumn.Name = "Xoa";
            xoaColumn.HeaderText = "Xóa";
            xoaColumn.Image = global::ThaiHoa.Win.QLSX.SanXuat.Properties.Resources.n_Delete;
            xoaColumn.Width = 30;
            xoaColumn.DisplayIndex = 6;
            dgvCongDoanChiTiet.Columns.Add(xoaColumn);
            CustomerGridView();
            
        }
        private void ReloadData()
        {
            if (db != null)
                db.Dispose();
            KhoiTao();
        }
        private void CustomerGridView()
        {
            //Ẩn toàn bộ columns
            foreach (DataGridViewColumn item in dgvCongDoanChiTiet.Columns)
            {
                item.Visible = false;
            }
            //Tùy chỉnh lại
            //Không cho edit
            dgvCongDoanChiTiet.ReadOnly = true;
            //Không cho thêm mới
            dgvCongDoanChiTiet.AllowUserToAddRows = false;
            //Ẩn row header
            dgvCongDoanChiTiet.RowHeadersVisible = false;
            //Tên
            var c = dgvCongDoanChiTiet.Columns["TenCongDoan"];
            c.Visible = true;
            c.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;
            c.DisplayIndex = 1;

            //Nguyên công
            c = dgvCongDoanChiTiet.Columns["NguyenCong"];
            c.Visible = true;
            c.Width = 120;
            c.DisplayIndex = 2;

            //Máy
            c = dgvCongDoanChiTiet.Columns["May"];
            c.Visible = true;
            c.Width = 60;
            c.DisplayIndex = 3;

            //Định mức
            c = dgvCongDoanChiTiet.Columns["DinhMuc"];
            c.Visible = true;
            c.Width = 80;
            c.DisplayIndex = 4;

            //Xóa
            c = dgvCongDoanChiTiet.Columns["Xoa"];
            c.Visible = true;
            c.Width = 30;
            c.DisplayIndex = 5;

        }
        /// <summary>
        /// Kiểm tra hợp lệ dữ liệu
        /// True: hợp lệ
        /// False :chưa hợp lệ
        /// </summary>
        /// <returns></returns>
        private bool KiemTraHopLeDuLieu()
        {
            bool result = true;
            errP.Clear();
            //Kiểm tra dây chuyền
            if (cbThanhPham.SelectedItem == null)
            {
                errP.SetError(cbThanhPham, "Dây chuyền không được rỗng");
                result = false;
            }
            if (congDoan.ChiTiet.Count < 1)
            {
                Common.ShowMessengerError("Số công đoạn không được nhỏ hơn 1");
            }
            return result;
        }
        private int LuuLai()
        {
            if (!KiemTraHopLeDuLieu()) return -1;
            if (MessageBox.Show("Lưu thay đổi ?", "Lưu Lại", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                if(Id==Guid.Empty)//trường hợp thêm mới
                {
                    db.CongDoan.Add(congDoan);
                    //Thêm vào db bán thành phẩm tương ứng
                    BanThanhPham banThanhPham;
                    foreach (CongDoanChiTiet item in congDoan.ChiTiet)
                    {
                        banThanhPham = new BanThanhPham();
                        banThanhPham.MaMatHang = item.CongDoan.ThanhPham.MaMatHang +"-" + item.NguyenCong;
                        banThanhPham.TenMatHang = item.CongDoan.ThanhPham.TenMatHang +"-"+ item.NguyenCong;
                        banThanhPham.DonViTinh = item.CongDoan.ThanhPham.DonViTinh;
                        banThanhPham.ThanhPham = item.CongDoan.ThanhPham;
                        banThanhPham.CongDoanChiTiet = item;
                        db.BanThanhPham.Add(banThanhPham);
                    }
                    
                 
                }
                else // trường hợp edit
                {
                    CongDoan item = db.CongDoan.Include(c => c.ThanhPham).Include(c => c.ChiTiet).FirstOrDefault(c => c.Id.Equals(Id));
                    if (item == null)
                        return 0;
                    item.ChiTiet = congDoan.ChiTiet;
                    //Thêm vào db bán thành phẩm tương ứng
                    BanThanhPham banThanhPham;
                    List<BanThanhPham> listBanThanhPham = new List<BanThanhPham>();
                    foreach (CongDoanChiTiet subItem in item.ChiTiet)
                    {
                        string maMatHang=subItem.CongDoan.ThanhPham.MaMatHang +"-"+ subItem.NguyenCong;
                        string tenMatHang=subItem.CongDoan.ThanhPham.TenMatHang +"-" + subItem.NguyenCong;
                        //Kiểm tra xem mã thành phẩm này đã có chưa
                        if (!db.BanThanhPham.Any(b => b.MaMatHang.Equals(maMatHang) && b.TenMatHang.Equals(tenMatHang)))//chưa có
                        {
                            //tiến hành thêm mới
                            banThanhPham = new BanThanhPham();
                            banThanhPham.MaMatHang = maMatHang;
                            banThanhPham.TenMatHang = tenMatHang;
                            banThanhPham.ThanhPham = subItem.CongDoan.ThanhPham;
                            banThanhPham.DonViTinh = subItem.CongDoan.ThanhPham.DonViTinh;
                            banThanhPham.CongDoanChiTiet = subItem;
                            listBanThanhPham.Add(banThanhPham);
                            db.BanThanhPham.Add(banThanhPham);
                        }
                    }
                    //xóa những bán thành phẩm cũ sau khi chỉnh sửa                   
                    List<BanThanhPham> listBanThanhPhamCu = db.BanThanhPham
                        .Include(b=>b.DonViTinh)
                        .AsEnumerable()
                        .Where(
                            b =>b.TrangThai 
                            && b.ThanhPham.Id.Equals(congDoan.ThanhPham.Id)
                            && listBanThanhPham
                                .Any(l=>l.MaMatHang.Equals(b.MaMatHang)
                                    && l.TenMatHang.Equals(b.TenMatHang))
                        )
                        .ToList();
                    foreach (BanThanhPham btp in listBanThanhPhamCu)
                    {
                        db.BanThanhPham.Remove(btp);
                    }

                }
                int result = db.SaveChanges();
                if (DBChanged != null)
                {
                    DBChanged(this, EventArgs.Empty);
                }
                return result;
            }
            else
                return 0;
        }
        private void Cancel()
        {
            if (MessageBox.Show("Hủy thay đổi ?", "Lưu Lại", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
            {
                ReloadData();
            }
        }
        private void Xoa()
        {
            if (Id == Guid.Empty)
            {
                this.Close();
                return;
            }
            if (Common.ShowMessengerConfirmDelete() == DialogResult.Yes)
            {
                CongDoan item = db.CongDoan.FirstOrDefault(c => c.Id.Equals(Id));
                if (item == null) 
                    return;
                db.CongDoan.Remove(item);
                db.SaveChanges();
                {
                    DBChanged(this, EventArgs.Empty);
                }
                this.Close();
            }
        }
        #endregion


        #region Events
        private void frmCongDoanSanXuatDetail_Load(object sender, EventArgs e)
        {
            KhoiTao();
        }
        private void btnSave_Click(object sender, EventArgs e)
        {
            int result = LuuLai();
            if (result >= 0) this.Close();
        }
        private void btnQuit_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnCancel_Click(object sender, EventArgs e)
        {
            Cancel();
        }
        private void btnAddNew_Click(object sender, EventArgs e)
        {
            acs.ShowFormCongDoanSanXuatDetail(Guid.Empty);
        }

        private void btnDelete_Click(object sender, EventArgs e)
        {
            Xoa();
        }

        void _frmCongNhanDetail_DBChanged(object sender, EventArgs e)
        {
            ReloadData();
        }
        private void btn_ThanhVien_AddNew_Click(object sender, EventArgs e)
        {
            ThanhPham thanhPham = cbThanhPham.SelectedItem as ThanhPham;
            if (thanhPham == null)
                return;
            congDoan.ThanhPham = thanhPham;
            frmCongDoanChiTietDetail _frmCongDoanChiTietDetail = new frmCongDoanChiTietDetail();
            _frmCongDoanChiTietDetail.congDoan = congDoan;
            _frmCongDoanChiTietDetail.CongDoanAddingNew += new EventHandler<AddingNewEventArgs>(_frmCongDoanChiTietDetail_CongDoanAddingNew);
            _frmCongDoanChiTietDetail.ShowDialog();
        }

        void _frmCongDoanChiTietDetail_CongDoanAddingNew(object sender, AddingNewEventArgs e)
        {
            CongDoanChiTiet item = e.NewObject as CongDoanChiTiet;
            if (item == null)
                return;
            //set tên thành phẩm cho lần đầu tiên
            if (congDoan.ChiTiet.Count == 0)
            {
                if (cbThanhPham.SelectedItem == null)
                    Common.ShowMessengerError("bạn phải chọn thành phẩm trước");
                congDoan.ThanhPham = cbThanhPham.SelectedItem as ThanhPham;
                cbThanhPham.Enabled = false;//Không cho thay đổi thành phẩm nữa
            }
            //Thay máy
            item.May = db.MayMoc.FirstOrDefault(m => m.Id.Equals(item.May.Id));
            if (item.May == null)
                return;
            congDoan.ChiTiet.Add(item);
            dgvCongDoanChiTiet.DataSource = null;
            dgvCongDoanChiTiet.DataSource = congDoan.ChiTiet.OrderBy(c => c.ThuTu).Where(c=>c.TrangThai).ToList();
            CustomerGridView();
        }
        private void dgvCongDoanChiTiet_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {

            int xoaIndex = dgvCongDoanChiTiet.Columns.IndexOf(dgvCongDoanChiTiet.Columns["Xoa"]);
            if (e.ColumnIndex == xoaIndex)
            {
                Guid Id = (Guid)dgvCongDoanChiTiet.Rows[e.RowIndex].Cells["Id"].Value;
                if (Id != null && Id != Guid.Empty)
                {
                    CongDoanChiTiet congDoanChiTiet =congDoan.ChiTiet.FirstOrDefault(d => d.TrangThai && d.Id.Equals(Id));
                    if (congDoanChiTiet != null)
                    {
                        //sắp xếp lại thứ tự của các mặt hàng
                        int indexOfCongDoanChiTiet;
                        indexOfCongDoanChiTiet = congDoan.ChiTiet.IndexOf(congDoanChiTiet);
                        //xóa mặt hàng đó
                        congDoanChiTiet.TrangThai = false;
                        //congDoan.ChiTiet.Remove(congDoanChiTiet);
                        //chỉnh lại thứ tự và tên nguyên công
                        //sắp xếp lại theo đúng trật tư
                        congDoan.ChiTiet = congDoan.ChiTiet.OrderBy(c => c.ThuTu).ToList();
                        int i = 0;
                        foreach (CongDoanChiTiet item in congDoan.ChiTiet)
                        {
                            if (item.TrangThai)
                            {
                                item.ThuTu = i + 1;
                                item.NguyenCong = string.Format("NC{0}", item.ThuTu.ToString());
                                i++;
                            }
                        }
                        //reload lại gridview
                        dgvCongDoanChiTiet.DataSource = congDoan.ChiTiet.Where(d => d.TrangThai).ToList();
                        CustomerGridView();
                    }
                }
            }
        }
        private void btnMoveUp_Click(object sender, EventArgs e)
        {
            if (dgvCongDoanChiTiet.CurrentRow == null)
                return;
            int tenCongDoanRowIndex = dgvCongDoanChiTiet.CurrentRow.Index - 1;
            if (tenCongDoanRowIndex < 0)
                return;
            Guid Id = (Guid)dgvCongDoanChiTiet.CurrentRow.Cells["Id"].Value;
            CongDoanChiTiet cdct1 = congDoan.ChiTiet.FirstOrDefault(c => c.TrangThai && c.Id.Equals(Id));
            if (cdct1 == null)
                return;
            foreach (CongDoanChiTiet cdct2 in congDoan.ChiTiet)
                if (cdct2.TrangThai && cdct2.ThuTu.Equals(cdct1.ThuTu-1))
                    cdct2.ThuTu += 1;
            cdct1.ThuTu -= 1;
            //sắp xếp lại theo đúng trật tư
            congDoan.ChiTiet = congDoan.ChiTiet.OrderBy(c => c.ThuTu).ToList();
            //chỉnh lại thứ tự và tên nguyên công
            for (int i = 0; i < congDoan.ChiTiet.Count; i++)
            {
                congDoan.ChiTiet[i].ThuTu =i+1;
                congDoan.ChiTiet[i].NguyenCong = string.Format("NC{0}", congDoan.ChiTiet[i].ThuTu.ToString());
            }
            dgvCongDoanChiTiet.DataSource = congDoan.ChiTiet.Where(d => d.TrangThai).ToList();
            CustomerGridView();
            int tenCongDoanColumnIndex = dgvCongDoanChiTiet.Columns.IndexOf(dgvCongDoanChiTiet.Columns["TenCongDoan"]);
            dgvCongDoanChiTiet.CurrentCell = dgvCongDoanChiTiet[tenCongDoanColumnIndex, tenCongDoanRowIndex];
        }

        private void btnMoveDown_Click(object sender, EventArgs e)
        {
            if (dgvCongDoanChiTiet.CurrentRow == null)
                return;
            int tenCongDoanRowIndex = dgvCongDoanChiTiet.CurrentRow.Index + 1;
            if (tenCongDoanRowIndex == congDoan.ChiTiet.Count)
                return;
            Guid Id = (Guid)dgvCongDoanChiTiet.CurrentRow.Cells["Id"].Value;
            CongDoanChiTiet cdct1 = congDoan.ChiTiet.FirstOrDefault(c => c.TrangThai && c.Id.Equals(Id));
            if (cdct1 == null)
                return;
            foreach (CongDoanChiTiet cdct2 in congDoan.ChiTiet)
                if (cdct2.TrangThai && cdct2.ThuTu.Equals(cdct1.ThuTu + 1))
                    cdct2.ThuTu -= 1;
            cdct1.ThuTu += 1;
            //sắp xếp lại theo đúng trật tư
            congDoan.ChiTiet = congDoan.ChiTiet.OrderBy(c => c.ThuTu).ToList();
            //chỉnh lại thứ tự và tên nguyên công
            for (int i = 0; i < congDoan.ChiTiet.Count; i++)
            {
                congDoan.ChiTiet[i].ThuTu = i + 1;
                congDoan.ChiTiet[i].NguyenCong = string.Format("NC{0}", congDoan.ChiTiet[i].ThuTu.ToString());
            }
            dgvCongDoanChiTiet.DataSource = congDoan.ChiTiet.Where(d => d.TrangThai).ToList();
            CustomerGridView();
            int tenCongDoanColumnIndex = dgvCongDoanChiTiet.Columns.IndexOf(dgvCongDoanChiTiet.Columns["TenCongDoan"]);
            dgvCongDoanChiTiet.CurrentCell = dgvCongDoanChiTiet[tenCongDoanColumnIndex, tenCongDoanRowIndex];
        }
        #endregion

        

        
    }
}

